package internal

import (
	"encoding/json"
	"fmt"
	"github.com/gofiber/fiber/v2"
	"github.com/sirupsen/logrus"
	"strings"
)

const (
	msg200 = "请求成功"
	msg400 = "参数错误"
	msg401 = "登录已过期, 请重新登录"
	msg403 = "权限不足"
	msg404 = "页面找不到了"
	msg500 = "服务器开小差了"
)

func Resp(c *fiber.Ctx, code uint32, data interface{}, msgs ...string) error {
	var (
		err error
		msg string
	)

	switch code {
	case 200:
		msg = msg200
		if len(msgs) > 0 && msgs[0] != "" {
			msg = fmt.Sprintf("%s: %s", msg, strings.Join(msgs, "; "))
		}
	case 400:
		msg = msg400
		if len(msgs) > 0 && msgs[0] != "" {
			msg = fmt.Sprintf("%s: %s", msg, strings.Join(msgs, "; "))
		}
	case 401:
		msg = msg401
	case 403:
		msg = msg403
	case 404:
		msg = msg404
	default:
		msg = msg500
	}

	if data == nil {
		return c.Status(int(code)).JSON(fiber.Map{"status": code, "msg": msg})
	}

	switch data.(type) {
	case []byte:
		var val interface{}
		if err = json.Unmarshal(data.([]byte), &val); err != nil {
			logrus.Warnf("unmarshal gRPC bytes err: %v", err)
			return c.Status(int(code)).JSON(fiber.Map{"status": code, "msg": msg, "data": data})
		}

		return c.Status(int(code)).JSON(fiber.Map{"status": code, "msg": msg, "data": val})
	}

	return c.Status(int(code)).JSON(fiber.Map{"status": code, "msg": msg, "data": data})
}

func Resp200(c *fiber.Ctx, data interface{}, msgs ...string) error {
	var (
		msg = msg200
	)

	if len(msgs) > 0 {
		msg = fmt.Sprintf("%s: %s", msg, strings.Join(msgs, "; "))
	}

	if data == nil {
		return c.Status(200).JSON(fiber.Map{"status": 200, "msg": msg})
	}

	return c.JSON(fiber.Map{"status": 200, "msg": msg, "data": data})
}

func Resp400(c *fiber.Ctx, msgs ...string) error {
	var (
		msg = msg400
	)

	if len(msgs) > 0 {
		msg = fmt.Sprintf("%s: %s", msg, strings.Join(msgs, "; "))
	}

	return c.Status(400).JSON(fiber.Map{"status": 400, "msg": msg})
}

func Resp401(c *fiber.Ctx, msgs ...string) error {
	var (
		msg = msg401
	)

	if len(msgs) > 0 {
		msg = fmt.Sprintf("%s: %s", msg, strings.Join(msgs, "; "))
	}

	return c.Status(401).JSON(fiber.Map{"status": 401, "msg": msg})
}

func Resp403(c *fiber.Ctx, msgs ...string) error {
	var (
		msg = msg403
	)

	if len(msgs) > 0 {
		msg = fmt.Sprintf("%s: %s", msg, strings.Join(msgs, "; "))
	}

	return c.Status(403).JSON(fiber.Map{"status": 403, "msg": msg})
}

func Resp404(c *fiber.Ctx) error {
	return c.Status(404).JSON(fiber.Map{"status": 404, "msg": msg404})
}

func Resp500(c *fiber.Ctx, msgs ...string) error {
	var (
		msg = msg500
	)

	if len(msgs) > 0 {
		msg = fmt.Sprintf("%s: %s", msg, strings.Join(msgs, ";"))
	}

	return c.Status(500).JSON(fiber.Map{"status": 500, "msg": msg})
}
